perm filename NS1[F8,ALS] blob
sn#321377 filedate 1977-12-15 generic text, type C, neo UTF8
COMMENT ā VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 *CHECKERS FINAL REV of December 14 1977 0930 Hours
C00028 ENDMK
Cā;
*CHECKERS FINAL REV of December 14 1977 0930 Hours
*Resident package addresses
JOYT EQU H'0C00'
LINE EQU H'0FDF'
SHCB EQU H'0FE2'
INPF EQU H'0FE3'
WTLN EQU H'0FE5'
TXC EQU H'0FE8'
CMRG EQU H'0FEA'
DBNC EQU H'0FEB'
UPI EQU H'0FFA'
JOYI EQU H'21AD'
IJS EQU H'22DB'
SHL EQU H'27C6'
SHR EQU H'27D3'
PUSH EQU H'40A9'
POPS EQU H'40BC'
SPS EQU H'40D0'
WDG EQU H'4105'
WAUD EQU H'41C8'
WAU1 EQU H'41CC'
CDS EQU H'41D5'
WMS EQU H'4205'
UDAT EQU H'424D'
TRAN EQU H'43CD'
FCS EQU H'43D6'
WAIT EQU H'4501'
TIR EQU H'45DB'
SNE EQU H'46D6'
CLER EQU H'4762'
*Misc. constants
TCMD EQU H'44'
BCMD EQU H'6D'
TCOL EQU H'80' TEXT COLOR
ULIN EQU H'FA'
COM EQU H'8F7'
*RAM assignments
BFLG EQU H'0C20' BUTTON EDGE FLAG
BLNF EQU H'0C21' Blink flag
XBLN EQU H'0C22' X value to blink
YBLN EQU H'0C23' Y value to blink
BCNT EQU H'0C24' Counter used in OKMV
BKMV EQU H'0C25' Data to index book moves
HSAV EQU H'0C26' H save location
PLY0 EQU H'0C28' Place for player's ply depth choice
COL0 EQU H'0C29' Place for color choice(next after PLY0)
SELX EQU H'0C2A' SELE exit (0 norm, 1 M's 1st, -1 P's 1st)
AP20 EQU H'0C2C' ACTM+PASM+9 AT HL=20
XOLD EQU H'0C2D' XCOORD TOUCH POINT (DOUBLE JUMP)
YOLD EQU H'0C2E' YCOORD TOUCH POINT (DOUBLE JUMP)
CFLG EQU H'0C2F' COMPRESSION FLAG FOR PLY REC
OBJ0 EQU H'0C30' Board 1, thru H'0E0F'
TREE EQU H'0E10' Tree data, thru H'0EFF', Player's board f
TRE2 EQU H'0E20' Machine's first board here
TRE3 EQU H'0E3E' PASSED FLAG AT LEVEL 30
TRE5 EQU H'0E50' PLY 5 LOCATION
PLDJ EQU H'0E57' USED FOR TEMP STORE OF TOUCH POINT
PLMD EQU H'0E5B' Used for temp store of player's move inf
PLMV EQU H'0ED0' Overlay region used for player's moves
PLMF EQU H'0EE0' and move numbers
SCOR EQU H'0EF0' SCORE (HI:LO) 14 2 BYTE PAIRS
XPOS EQU H'0F0C' XPOSITION(CURSOR)
YPOS EQU H'0F0F' YPOSITION(CURSOR)
OBJ1 EQU H'0F10' Board 2, thru H'0FAF'
MOBS EQU H'0FB0' Mobility (14 bytes)
RGSV EQU H'0FC8' Register save start (int. update)
*Scratch pad assignments
MAT EQU 0 REGISTER USED FOR MATERIAL
POT EQU 6 REGISTER USED FOR POSITION
HLS EQU H'4' REG TO SAVE HL OFFSET
TEMP EQU H'8'
J EQU H'9'
HU EQU H'A'
HL EQU H'B'
PLOC EQU O'3' LISU value for ACTIVE and PASSIVE
KLOC EQU O'4' LISU value for KING's and special data
ELOC EQU O'5' LISU value for EMPTY's area
ISA EQU O'30' ISAR value for active area
ISP EQU O'34' ISAR value for passive
ISK EQU O'40' ISAR value for kings
ACTM EQU O'46' ISAR VALUE FOR ACTIVE MATERIAL
PASM EQU O'47' ISAR VALUE FOR PASSIVE MATERIAL
ISE EQU O'51' ISAR value foempty (with offset)
*Mimimum ply depths
PLYT EQU H'FD' Ply depth for Robot Tom (stored as neg.)
PLYD EQU H'FC' Ply depth for Robot Dick
PLYH EQU H'FB' Ply depth for Robot Harry
*SPECIAL CONSTANTS
MSK EQU H'1' X ZOOM BIT MASK (CMRG)
X EQU H'1'
Y EQU H'2'
VX EQU H'3'
VY EQU H'4'
CHT EQU H'3' CURSOR HEIGHT
YTST EQU H'9'
XZOP EQU H'34' LINE FOR RESTORE OF X ZOOM
MAXY EQU H'4D' MAX Y COORD (=H'4F'-CHT)
*Linkage locations
ORG H'1000' Initial operations and questions
DC H'AA'
DC H'55'
DC H'01' BACKGROUND COLOR
DC H'00' BACKGROUND COLOR
DC H'00' SPACES
DC H'00' SPACES
DC H'3119' CH
DC H'0B31' EC
DC H'150B' KE
DC H'0921' RS
DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
*-*-
PI CDS CLEAR DISPLAY
PI IJS INITIALIZE JOYSTICK TABLE
LISU 2 For safety only, can be removed later
LISL 6
CLR
XS S
BM QN1 Is clock running?
LI H'81' No, so start it
LR D,A
LIS 2
LR S,A
*-*-*-*- Initial question session
QN1 LIS H'4'
LR 0,A
PI SEDC SET MESSAGE LNGTH&LINE POINTER
DS 1 DEFAULT PLY=H'FD'
DS 1
DS 1 SET DEFAULT PLY DEPTH
DCI SKL
PI WMS WRITE MESSAGE
PI RKB AND DO KEYBOARD READ
CI H'2B'
BZ QN10 IS IT 'NIALL'?
CI H'11' NO.
BNZ QN11 IF NOT 'ARTHUR', THEN 'DAVE'
DS 1
QN10 DS 1
QN11 DCI PLY0
LR A,1 GET CORRECT PLY DEPTH
ST AND SAVE IT.
DS 0
DS 0 SET FOR BUT TWO LINES
PI CDS CLEAR DISPLAY
PI SEDC SET LINE POINTER
LIS H'5'
COM
AS S
LR S,A SET FOR BUT H'1A' LENGTH
DCI YMF DCO TO MESSAGE START
PI WMS SO WRITE MESSAGE
PI RKB READ KEYBOARD
CI H'2B' Is answer an N?
DCI COL0
CLR
LR 7,A Black plays first always
BZ QN13 N means machine first
COM
ST COL0<=-1, player is black
COM
ST SELX<=??, player first
BR QN14
QN13 ST COL0<=0, machine is black
ST SELX<=??, machine first
QN14 DCI BLKM TABLE OF POSSIBLE MOVES
XDC
DCI PLMV List to verify moves
LIS H'7'
LISU 2
LISL 0
LR S,A SET TRANSFER COUNT
PI TRAN DO TRANSFER
DCI BKMV
CLR
ST Clear Book move index value
DCI CMRG
LI H'65'
ST SET FOR X & Y ZOOM
PI CLER CLER UM1 REGISTERS
DCI UPI DCO TO UPDATE CONTROLS
LIS H'3'
ST SET INTO COUNT
CLR
ST SET FOR FULL INIT
LI INIT:
ST
LI INIT.
ST AND SET ADDRESS
PI WAUD WAIT, THEN UPDATE
LIS H'5'
LR S,A GET TRANSFER COUNT
DCI BDAT SET SOURCE
XDC INTO DC1
DCI UPI+1 DESTINATION
PI TRAN TRANSFER DATA
PI WAUD WAIT, DO UPDATE, RESET ISAR&RET.
PI ENIN NOW ENABLE INTERRUPT
*-*-*- Load SC for initial board
LISU PLOC LOAD SCRATCHPAD AS
LISL 7 FOLLOWS:
CLR
BRDJ LR D,A O'30'=FF
BR7 BRDJ O'31'=F0
COM O'32'=0
LR I,A O'33'=0
LR I,A O'34'=0
SL 4 O'35'=0
LR I,A O'36'=F
LISL 6 O'37'=FF
LIS H'F'
LR I,A
LISU KLOC
LISL H'7'
CLR
BRDK LR D,A O'40' thru O'47' = 0
BR7 BRDK
LI H'18' SET PASSIVE AND ACTIVE MATERIAL
LR D,A COUNTS TO H'18'=D'24' INITIALLY
LR D,A
DCI TRE2
PI SCRD SR to RAM for machine's first move
DCI TREE
PI SCRD SR to RAM for player's first move
PI BORD Generate board image with men
DCI XPOS
LIS H'0'
ST SET FOR LEFT MOST
LIS H'3'
ST
LIS H'0'
ST
DCI YPOS
ST AND SET FOR TOPMOST
*-*-*-*-*-*-*-*-*-*- Start play
DCI H'8F5'
CLR
ST SET BACKGROUND BLACK
DCI COL0
CLR
XM
BM PMOV Player chose Black
*-*-*- Machine's first move if playing black
LISU 2
LISL 5
LIS H'7' Used as random number
NS S Save last 3 bits
LR 0,A Use this number to select move
DCI BKMV Book move index
SL 4 Save space for second move
SR 1
ST Record first move
DCI PLMV
QN17 LM Get byte record
LR 1,A
QN18 LR A,1
NS 1
BNZ QN19 Is this byte exhausted?
LM Step over byte info
BR QN17 Go to next byte record
QN19 LR 2,A
AI H'FF' Subtract 1
NS 1
LR 1,A byte less rightmost bit
XS 2 This leaves 1 bit in A
DS 0
BP QN18
LR 6,A Save the byte bit
LM Get the byte info
LR 4,A The byte indicator
DCI TRE2 Machine's board is here
LR H,DC
LIS H'C'
ADC
LR A,6
ST
LR A,4
ST
JMP SELE Go to SELE to make move
*
*Player's move
*
PMOV PI MWAD Wait, then update
PI MVC Initiate cursor
DCI TREE Player's board is here
LR H,DC
MES0 CLR "YOUR MOVE"
MES1 LR 0,A Identify message
PI WMC Write message
DCI BLNF
CLR
ST
CUR1 PI CURS Initiate cursor
*-*- Now X in 1, Y in 2, byte in 3 and byte # in 4
OKPI DCI PLMV Possible moves listing
OKP1 CLR
XM
BNZ OKP3 An entry found
LR A,5 Byte info
NI H'10' Extract J bit
LIS H'5' "PIECE CAN'T MOVE"
BZ OKP2
LIS H'1' "MUST JUMP"
OKP2 BR MES1 Try again
OKP3 NS 3 Compare
BNZ OKP4 This might be the one
LM A cheap way to index
LR 5,A Save for jump info
BR OKP1 Try again
OKP4 LM Next entry is the byte info
LR 5,A Save it
SR 1
SR 1
NI H'3' Remove the J bit and the direction
XS 4 Does it match?
BNZ OKP1 Try again
DCI PLMD Save data as to starting square
LR A,1 X
ST
LR A,2 Y
ST
LR A,3 BYTE
ST
LR A,4 Byte info
ST
LIS H'3'
COM
DCI BCNT Counter
ST
DCI BLNF Blink flag
LIS H'1' Set on
ST
LR A,1 Save X value
ST in XBLN
LR A,2 Save Y value
ST in YBLN
CUR2 PI CURS
DCI PLDJ STORE POSSIBLE TOUCH POINT
LR A,1
ST
LR A,2
ST
LR A,3
ST
LR A,4
ST
DCI PLMD+2 Restore initial values
LM
LR 3,A for BYTE
LM
LR 4,A and BYTE number
*Now test indicated move for legality
OKMV DCI PLMD Saved data location
LM Get the old X value
COM
INC
AS 1 This gives us the change in X
BNZ OKM01
JMP NON2 ILLEGAL
OKM01 LR 1,A Save the difference
BP OKM1
COM
INC
OKM1 LR 0,A |X|
CI H'2'
BP OKM02
JMP NON3 TOO FAR
OKM02 CLR Anticipate normal move
BNZ OKM2
LI H'10' Set Jump bit
OKM2 LR 6,A save byte info here
LM Get the old Y value
COM
INC
AS 2
LR 2,A Change in Y
BM OKM3
COM
INC
OKM3 AS 0
BNZ NON2 |X||Y|
LR A,2
NS 2
BP OKM4
LIS H'2' Backward bit
AS 6
LR 6,A
OKM4 LR A,1
NS 1
BM OKM5
LIS H'1' Left bit
AS 6
LR 6,A
OKM5 LR A,4 Get initial Byte #
SL 1 Shift it left to position
SL 1
AS 6 Add in the J and Direction bits
LR 6,A Final byte info from cursor
DCI PLMV Possible moves listing
LIS H'8' 7 moves possible
LR 0,A
OKM6 CLR
XM
BZ NONO No more entries
LR 1,A
LM
LR 5,A Save byte info
OKM7 CLR
XS 1
BZ OKM6 Last bit tested
LR 2,A We'll need it again
AI H'FF' Subtract 1
NS 1
LR 1,A Byte with bit removed
XS 2 Get extracted bit
DS 0 Count tries
NS 3 Does it check with 3
BZ OKM7 Not in table entry, try again
LR A,5 But does byte info agree?
XS 6 Compare 6 with table value
BNZ OKM7 No so count remaining bits in 1
LIS H'7' Found, so reorder count
XS 0 order from 0 thru 6
DCI BKMV
ST Save move count for book move entry
PI MWAD DO MY WAIT THEN UPDATE
PI MVC Turn off cursor
PI ENIN NOW ENABLE INTERRUPT
DCI TREE Store final values
LR H,DC
LIS H'C'
ADC
LR A,3
ST Store byte
LR A,6
ST And byte info
*Before going to SELE, we want to
*set the BLINK coordinates to
*match the "CURRENT" position
DCI XBLN DESTINATION
XDC SAVE IN DC1
DCI XOLD DCO TO XPOSITION
LM GET SAME
XDC GET DESTINATION
ST AND SET SAME
XDC SAVE NEW DESTINATION
LM GET OLD Y POSITION
XDC
ST AND RESET TO BLINK THERE
DCI BLNF DCO TO BLINK FLAG
LIS H'1'
ST SET FOR BLINK
JMP SELE
NONO LR A,5
NI H'10' A jump required?
LIS H'2'
BZ NON4
LIS H'1'
BR NON4
NON2 LIS H'2'
BR NON4
NON3 LIS H'3'
NON4 LR 0,A
DCI BCNT
LM
INC
DCI BCNT
ST
BM NON5
JMP MES0
NON5 PI WMC
JMP CUR2
DJMP DCI BCNT SET COUNTER FOR
LI H'82' LARGE NUMBER OF
ST TRIALS
DCI PLMD
XDC
DCI PLDJ
LIS H'4'
LR 0,A
DJMP1 LM GET OLD TOUCH POINT DATA
XDC
ST AND TRANSFER TO PLMD
XDC
DS 0 DECREMENT COUNT
BNZ DJMP1 DONE ENOUGH TRANSFER?
PI MWAD DO MY WAIT, THEN UPDATE
PI MVC TURN CURSOR ON
LIS H'6'
LR 0,A SET FOR "CONTINUE JUMP" MESSAGE
BR NON5 AND DISPLAY SAME
*-*-*- Message writing, uses R0, 1, SC O'24'
* calls UPDATE routine. Message # in 0.
WMC LR K,P SAVE RETURN ADDRESS
PI PUSH PUSH ONTO STACK
DCI H'872'
LI H'82'
ST TURN MESSAGE OBJECT OFF...
DCI HSAV
LR A,HU
ST
LR A,HL
ST
PI MWAD WAIT, THEN UPDATE
DCI WMCA DCO TO MESSAGE ADDRESS START
LR A,0 GET MESSAGE NUMBER
SL 1
AS 0
ADC ADD 3XNUMBER TO DCO
LISU 2
LISL 4 SET ISAR TO O'24'
LM
LR S,A SET MESSAGE LENGTH
LM
LR QU,A
LM
LR QL,A MESSAGE ADDRESS INTO Q
DCI LINE
LIS H'5'
SL 4
ST SET PROPER LINE NUMBER
DCI H'0E5F' DCO TO MESSAGE BUILD AREA
LIS H'7'
SL 4
LR 1,A SET COUNTER
CLR CLEAR ACC
WMC1 ST
DS 1
BNZ WMC1 CLEAR TEXT AREA
PI WAUD WAIT, THEN DO UPDATE
DCI H'872'
LIS H'2'
ST TURN OBJECT ON
LR DC,Q SET ADDRESS INTO DCO
PI WMS WRITE MESSAGE
PI MWAD WAIT, THEN UPDATE
DCI HSAV
LM
LR HU,A
LM
LR HL,A
PI ENIN ENABLE INTERRUPTS ONCE MORE
PI POPS POP RETURN ADDRESS
PK AND RETURN
*-*-*-*-*-*-*-*-*-*
* DATA FOR WMC